// contexts/AuthContext.tsx
'use client';
import { createContext, useContext, useState, useEffect, ReactNode } from 'react';
// 导入Next.js导航钩子，用于页面跳转
import { useRouter } from 'next/navigation';

/**
 * 用户信息类型定义
 * 描述系统中用户对象的结构
 */
export interface User {
    id: string;               // 用户唯一标识
    name: string;             // 用户名
    email: string;            // 电子邮箱
    avatar: string;           // 头像图片路径
    memberLevel: string;      // 会员等级
    joinDate: string;         // 注册日期
    lastLogin: string;        // 最后登录时间
    notificationCount: number;// 未读通知数量
}

/**
 * 账号密码登录表单数据类型
 * 定义账号密码登录所需的参数结构
 */
export interface LoginData {
    username: string;         // 用户名/账号
    password: string;         // 密码
}

/**
 * 手机号验证码登录数据类型
 * 定义手机号验证码登录所需的参数结构
 */
export interface PhoneLoginData {
    phone: string;            // 手机号
    code: string;             // 验证码
}

/**
 * 认证上下文内容类型
 * 定义Context中包含的状态和方法
 */
interface AuthContextType {
    user: User | null;                  // 当前登录用户信息，未登录为null
    isLoggedIn: boolean;                // 是否已登录（派生状态）
    loading: boolean;                   // 初始化加载状态
    login: (data: LoginData) => Promise<boolean>;       // 账号密码登录方法
    phoneLogin: (data: PhoneLoginData) => Promise<boolean>;  // 手机号验证码登录方法
    logout: () => void;                 // 退出登录方法
}

/**
 * 创建认证上下文
 * 初始值为undefined，后续由Provider提供具体值
 */
const AuthContext = createContext<AuthContextType | undefined>(undefined);

/**
 * 模拟用户数据
 * 开发阶段使用，实际项目中会从后端API获取真实用户信息
 */
const mockUser: User = {
    id: '1',
    name: '洋歌',
    email: '1224162761@qq.com',
    avatar: '/images/user.png',
    memberLevel: '高级会员',
    joinDate: '2022-03-15',
    lastLogin: '2023-06-10 14:30',
    notificationCount: 3
};

/**
 * 认证状态提供者组件
 * 负责管理认证状态并为子组件提供访问接口
 * @param children - 子组件树
 */
export function AuthProvider({ children }: { children: ReactNode }) {
    // 存储当前登录用户信息，初始为null
    const [user, setUser] = useState<User | null>(null);
    // 加载状态，用于控制初始化过程中的加载状态显示
    const [loading, setLoading] = useState(true);
    // 获取路由实例，用于页面跳转
    const router = useRouter();

    /**
     * 初始化效果：从本地存储恢复用户状态
     * 组件挂载时执行一次，从localStorage读取保存的用户信息
     * 实现页面刷新后登录状态不丢失
     */
    useEffect(() => {
        // 从localStorage获取保存的用户信息
        const storedUser = localStorage.getItem('user');
        if (storedUser) {
            // 解析并设置用户信息
            setUser(JSON.parse(storedUser));
        }
        // 初始化完成，结束加载状态
        setLoading(false);
    }, []);

    /**
     * 账号密码登录方法
     * @param data - 包含用户名和密码的登录数据
     * @returns Promise<boolean> - 登录成功返回true，失败返回false
     */
    const login = async (data: LoginData): Promise<boolean> => {
        // 模拟API请求延迟（实际项目中替换为真实接口调用）
        return new Promise((resolve) => {
            setTimeout(() => {
                // 模拟登录成功（实际项目中需要验证账号密码正确性）
                // 更新用户状态
                setUser(mockUser);
                // 将用户信息保存到localStorage实现持久化
                localStorage.setItem('user', JSON.stringify(mockUser));
                // 保存认证令牌（实际项目中由后端返回）
                localStorage.setItem('auth_token', 'mock-token-123');
                // 通知调用者登录成功
                resolve(true);
            }, 800); // 模拟网络请求延迟800ms
        });
    };

    /**
     * 手机号验证码登录方法
     * @param data - 包含手机号和验证码的登录数据
     * @returns Promise<boolean> - 登录成功返回true，失败返回false
     */
    const phoneLogin = async (data: PhoneLoginData): Promise<boolean> => {
        // 模拟API请求（实际项目替换为真实接口）
        return new Promise((resolve) => {
            setTimeout(() => {
                // 模拟登录成功（实际项目中需要验证手机号和验证码）
                setUser(mockUser);
                localStorage.setItem('user', JSON.stringify(mockUser));
                localStorage.setItem('auth_token', 'mock-token-123');
                resolve(true);
            }, 800);
        });
    };

    /**
     * 退出登录方法
     * 清除用户状态、本地存储并跳转到首页
     */
    const logout = () => {
        // 清除用户状态
        setUser(null);
        // 清除本地存储的用户信息
        localStorage.removeItem('user');
        // 清除认证令牌
        localStorage.removeItem('auth_token');
        // 跳转到首页
        router.push('/');
    };

    // 提供认证上下文值给子组件
    return (
        <AuthContext.Provider
            value={{
                user,
                isLoggedIn: !!user,  // 派生状态：如果user存在则为true，否则为false
                loading,
                login,
                phoneLogin,
                logout,
            }}
        >
            {children}  {/* 渲染子组件树 */}
        </AuthContext.Provider>
    );
}

/**
 * 自定义Hook：简化组件对认证上下文的访问
 * 确保在AuthProvider内部使用，否则抛出错误
 * @returns AuthContextType - 认证上下文内容
 */
export const useAuth = () => {
    // 获取上下文内容
    const context = useContext(AuthContext);
    // 检查上下文是否存在（是否在AuthProvider内部使用）
    if (context === undefined) {
        throw new Error('useAuth must be used within an AuthProvider');
    }
    // 返回上下文内容
    return context;
};
